package com.wxm.api;

import com.wxm.api.xml.Container;
import com.wxm.api.xml.CrawlerFiledContainer;
import com.wxm.dom4j.base.XmlFile;
import org.dom4j.Document;
import org.dom4j.Element;
import org.springframework.core.io.ClassPathResource;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 *      Crawler工具类
 * </p>
 *
 * @author wxm
 * @Date 2021/9/29
 */
public class CrawlerUtil {
    private CrawlerUtil(){}


    /**
     * 获取xml中内容进行解析
     * @param xmlName xml文件名称,classpath下的文件名称
     * @return List<Crawling>
     * @throws Exception e
     */
    public static List<? extends Container> getCrawlingList(String xmlName) throws Exception {
        // ClassPathResource类的构造方法接收路径名称，自动去classpath路径下找文件
        ClassPathResource classPathResource = new ClassPathResource(xmlName);
        // 获得File对象，当然也可以获取输入流对象
        XmlFile xmlFile = new XmlFile(classPathResource.getFile());
        //得到dom
        Document document = xmlFile.getDocument();
        //得到dom根元素
        Element rootElement = document.getRootElement();
        //解析
        return CrawlerUtil.analysisElement(rootElement.elements("crawler"));
    }


    /**
     * 进行解析
     * @param elements 元素
     * @return List<? extends CrawlerContainer>
     */
    @SuppressWarnings("unchecked")
    private static List<? extends Container> analysisElement(List<Element> elements){
        List<Container> list = new ArrayList<>();
        for (Element element : elements) {
            Container container = ContainerFactory.getContainer(element);
            //得到子集
            if (container != null) {
                List<? extends Container> childCrawling = CrawlerUtil.analysisElement(element.elements());
                container.setChildren((List<CrawlerFiledContainer>) childCrawling);
                list.add(container);
            }
        }
        return list;
    }
}
